home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Online / opennap / list_channels.c < prev    next >
C/C++ Source or Header  |  2001-06-08  |  2KB  |  87 lines

  1. /* Copyright (C) 2000-1 drscholl@users.sourceforge.net
  2.    This is free software distributed under the terms of the
  3.    GNU Public License.  See the file COPYING for details.
  4.  
  5.    $Id: list_channels.c,v 1.11 2001/02/15 08:39:45 drscholl Exp $ */
  6.  
  7. #include "opennap.h"
  8. #include "debug.h"
  9.  
  10. /* because there might be cloaked users on a channel, the effective channel
  11.  * count is not the same as the list membership, unless the user issuing
  12.  * the list is a mod+
  13.  */
  14. static int
  15. effective_channel_count (LIST * list, int mod)
  16. {
  17.     int     count = 0;
  18.     CHANUSER *chanuser;
  19.  
  20.     if (mod)
  21.     return list_count (list);
  22.     for (; list; list = list->next)
  23.     {
  24.     chanuser = list->data;
  25.     if (!chanuser->user->cloaked)
  26.         count++;
  27.     }
  28.     return count;
  29. }
  30.  
  31. static void
  32. channel_info (void *elem, void *data)
  33. {
  34.     CHANNEL *chan = (CHANNEL *) elem;
  35.  
  36.     ASSERT (VALID (elem));
  37.     ASSERT (VALID (data));
  38.     if ((chan->flags & ON_CHANNEL_PRIVATE) == 0)
  39.     send_cmd ((CONNECTION *) data, MSG_SERVER_CHANNEL_LIST /* 618 */ ,
  40.           "%s %d %s", chan->name,
  41.           effective_channel_count (chan->users,
  42.                        ((CONNECTION *) data)->user->
  43.                        level >= LEVEL_MODERATOR),
  44.           chan->topic);
  45. }
  46.  
  47. /* send a list of channels we know about to the user */
  48. HANDLER (list_channels)
  49. {
  50.     ASSERT (validate_connection (con));
  51.  
  52.     (void) pkt;            /* unused */
  53.     (void) tag;
  54.     (void) len;
  55.  
  56.     CHECK_USER_CLASS ("list_channels");
  57.     hash_foreach (Channels, channel_info, con);
  58.     send_cmd (con, MSG_SERVER_CHANNEL_LIST_END /* 617 */ , "");
  59. }
  60.  
  61. static void
  62. full_channel_info (CHANNEL * chan, CONNECTION * con)
  63. {
  64.     ASSERT (validate_channel (chan));
  65.     ASSERT (validate_connection (con));
  66.     ASSERT (chan->topic != 0);
  67.     if ((chan->flags & ON_CHANNEL_PRIVATE) == 0)
  68.     send_cmd (con, MSG_SERVER_FULL_CHANNEL_INFO, "%s %d %d %d %d \"%s\"",
  69.           chan->name,
  70.           effective_channel_count (chan->users,
  71.                        con->user->level >=
  72.                        LEVEL_MODERATOR),
  73.           (chan->flags & ON_CHANNEL_REGISTERED) == 0, chan->level,
  74.           chan->limit, chan->topic);
  75. }
  76.  
  77. /* 827 */
  78. HANDLER (full_channel_list)
  79. {
  80.     ASSERT (validate_connection (con));
  81.     CHECK_USER_CLASS ("list_all_channels");
  82.     (void) pkt;
  83.     (void) len;
  84.     hash_foreach (Channels, (hash_callback_t) full_channel_info, con);
  85.     send_cmd (con, tag, "");
  86. }
  87.